02-Ollama 在 LangChain 中的使用 - JavaScript 集成
简介
本文档介绍了如何在 JavaScript 环境中使用 Ollama 与 LangChain 集成,以创建强大的 AI 应用。Ollama 是一个开源的大语言模型部署工具,而 LangChain 则是一个用于构建基于语言模型的应用的框架。通过结合这两者,我们可以在本地环境中快速部署和使用先进的 AI 模型。
注: 本文档包含核心代码片段和详细解释。完整代码可在 notebook/c5/ollama_langchain_javascript 中找到。
1. 环境设置
配置Node.js环境
首先,确保你的系统已安装 Node.js。你可以从 Node.js官网 下载并安装最新版本。
创建项目并安装依赖
- 切换到运行目录运行:
cd notebook/C5/ollama_langchain_javascript
npm init -y
- 安装必要的依赖:
npm install @langchain/ollama @langchain/core @langchain/community zod
- 在
package.json文件中添加"type": "module"以启用ES模块支持:
{
"type": "module",
// ... 其他配置
}
2. 下载所需模型并初始化 Ollama
下载 llama3.1 模型
- 进入官网 https://ollama.com/download 下载并安装 Ollama 到可用的受支持平台。
- 查看 https://ollama.ai/library 了解所有可用的模型。
- 通过
ollama pull <name-of-model>命令获取可用 LLM 模型(例如:ollama pull llama3.1)。
命令行执行完毕后如图所示:

模型存储位置:
- Mac:
~/.ollama/models/ - Linux(或 WSL):
/usr/share/ollama/.ollama/models - Windows:
C:\Users\Administrator\.ollama\models
下载完毕后,需要确保 Ollama 服务已经启动:
ollama ps
3. 基本使用示例
使用 ChatOllama 进行简单对话
可运行 base_chat.js 文件,具体代码如下:
import { Ollama } from "@langchain/community/llms/ollama";
const ollama = new Ollama({
baseUrl: "http://localhost:11434", // 确保Ollama服务已经启动
model: "llama3.1", // 替换为实际使用的模型
});
const stream = await ollama.stream(
`你比GPT4厉害吗?`
);
const chunks = [];
for await (const chunk of stream) {
chunks.push(chunk);
}
console.log(chunks.join(""));
运行代码:
node base_chat.js
这段代码做了以下几件 事:
- 导入 Ollama 类并初始化它,指定模型和基础URL。
- 使用
stream方法发送一个问题给模型,这允许我们逐块接收响应。 - 使用 for-await 循环收集所有响应块。
- 将所有块组合并打印出完整响应。
多模态模型使用
运行base_multimodal.js文件,具体代码如下:
import { Ollama } from "@langchain/community/llms/ollama";
import * as fs from "node:fs/promises";
const imageData = await fs.readFile("../../../docs/../../image/C5-1-4.png"); // 可以替换为你想询问的图片
const model = new Ollama({
model: "llava",
baseUrl: "http://127.0.0.1:11434",
}).bind({
../../image: [imageData.toString("base64")],
});
const res = await model.invoke("图片里是什么动物呀?");
console.log({ res });
运行代码:
node base_multimodal.js
这段代码演示了如何使用多模态模型(如 llava)处理图像和文本输入:
- 读取图像文件并将其转换为base64编码。
- 初始化 Ollama 模型,并使用
bind方法将图像数据绑定到模型。 - 使用
invoke方法发送一个关于图像的问题。 - 打印模型的响应。
工具调用
运行 base_tool.js 文件,代码如下:
import { tool } from "@langchain/core/tools";
import { ChatOllama } from "@langchain/ollama";
import { z } from "zod";
// 定义简单计算器工具
const simpleCalculatorTool = tool((args) => {
const { operation, x, y } = args;
switch (operation) {
case "add":
return x + y;
case "subtract":
return x - y;
case "multiply":
return x * y;
case "divide":
if (y !== 0) {
return x / y;
} else {
throw new Error("Cannot divide by zero");
}
default:
throw new Error("Invalid operation");
}
}, {
name: "simple_calculator",
description: "Perform simple arithmetic operations",
schema: z.object({
operation: z.enum(["add", "subtract", "multiply", "divide"]),
x: z.number(),
y: z.number(),
}),
});
// 定义模型
const llm = new ChatOllama({
model: "llama3.1",
temperature: 0,
});
// 将工具绑定到模型
const llmWithTools = llm.bindTools([simpleCalculatorTool]);
// 使用模型 进行工具调用
const result = await llmWithTools.invoke(
"你知道一千万乘二是多少吗?请使用 'simple_calculator' 工具来计算。"
);
console.log(result);
运行代码:
node base_tool.js
这段代码展示了如何定义和使用工具:
- 使用
tool函数定义一个简单的计算器工具,包括操作逻辑和参数schema。 - 初始化 ChatOllama 模型。
- 使用
bindTools方法将工具绑定到模型。 - 使用
invoke方法发送一个需要计算的问题,模型会自动调用相应的工具。
